Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 skin-theme-clientpref-day vector-sticky-header-enabled" lang="de" dir="ltr"><head>
<meta charset="UTF-8">
<title>Shellcode</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://de.wikipedia.org/wiki/Shellcode"> <link href="./_mw_/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link href="./_mw_/ext.gadget.citeRef.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.defaultPlainlinks.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonHide.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonLayout.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonStyle.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiDarkmode.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiResponsive.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.specialSearch.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Shellcode rootpage-Shellcode skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Shellcode</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="de" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="de" dir="ltr"><p><b>Shellcode</b> ist ein Begriff aus der <a href="Programmierung" title="Programmierung">Programmierung</a> und bezeichnet einen zumeist sehr kleinen Patch von in <a href="Opcode" title="Opcode">Opcodes</a> umgewandelten <a href="Assemblersprache" title="Assemblersprache">Assemblerbefehlen</a>, mit denen beabsichtigt wird, ein Programm oder System zu manipulieren, oder für nicht vorgesehene Zwecke auszunutzen. Dabei wird oft versucht, eine <a href="Kommandozeileninterpreter" title="Kommandozeileninterpreter">Shell</a> zu starten, daher auch der Name. Shellcodes haben ihren Ursprung in <a href="Puffer%C3%BCberlauf" title="Pufferüberlauf">Pufferüberlauf</a>- und anderen Code-Injektions-Attacken, sie können aber auch bei <a href="Softwaretest" title="Softwaretest">Software-</a>, insbesondere <a href="Penetrationstest_(Informatik)" title="Penetrationstest (Informatik)">Penetrationstests</a> zum Einsatz kommen, beim Experimentieren und in der Didaktik.
</p>

<div class="mw-heading mw-heading2"><h2 id="Erstellen_von_Shellcodes">Erstellen von Shellcodes</h2></div>
<p>Zur Erzeugung von Shellcode kann der auszuführende Befehl in <a href="C_(Programmiersprache)" title="C (Programmiersprache)">C</a> geschrieben und mit einem <a href="Compiler" title="Compiler">Compiler</a> übersetzt werden. Das erzeugte Programm wird nun disassembliert (rückübersetzt) und die Funktionsweise des Programms in Assemblersprache nachprogrammiert. Viele Instruktionen können aber weggelassen oder verkürzt werden. Bei vielen <a href="Exploit" title="Exploit">Exploits</a> darf im Shellcode kein <a href="Nullzeichen" title="Nullzeichen">0-Byte</a> enthalten sein, weil dieses in C das String-Ende markiert. Im Allgemeinen müssen weitere Hindernisse umgangen werden, beispielsweise werden nur Buchstaben und Zahlen zugelassen oder die Groß- und Kleinschreibung verändert, oder es müssen bestimmte Offsets eingehalten werden, was etwa durch Auffüllen mit mehr oder minder kreativen Ketten von <a href="Nulloperation" title="Nulloperation">Nulloperationen</a> (sog. <i>NOP Slides</i>) erreicht werden kann.
</p><p>Anstatt eigenen Code auszuführen, was nicht immer möglich ist (zum Beispiel bei Verwendung von <a href="Speicherschutz" title="Speicherschutz">Speicherschutz</a>), kann man auch direkt zu gewünschten Funktionen springen, die beispielsweise im Programm selber oder einer geladenen <a href="Programmbibliothek" title="Programmbibliothek">Bibliothek</a>, beispielsweise der libc vorhanden sind. Dieses Verfahren wird <a href="Return_into_libc" title="Return into libc">return into libc</a> genannt.
</p>
<div class="mw-heading mw-heading2"><h2 id="Beispiel">Beispiel</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Lokaler_execve(/bin/sh)_Shellcode"><span id="Lokaler_execve.28.2Fbin.2Fsh.29_Shellcode"></span>Lokaler execve(/bin/sh) Shellcode</h3></div>
<p>Der Assembler-Code (x86-Architektur):<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-highlight mw-highlight-lang-asm mw-content-ltr" dir="ltr"><pre><span></span><span class="nf">void</span><span class="w"> </span><span class="no">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="nf">__asm__</span><span class="p">(</span><span class="err">"</span>
<span class="nf">jmp</span><span class="w"> </span><span class="mi">0x2a</span><span class="w"> </span><span class="c1"># 3 bytes - springt direkt vor den String</span>
<span class="nf">popl</span><span class="w"> </span><span class="nv">%esi</span><span class="w"> </span><span class="c1"># 1 byte - Adresse des Strings wird in esi geladen</span>
<span class="nf">movl</span><span class="w"> </span><span class="nv">%esi</span><span class="p">,</span><span class="mi">0x8</span><span class="p">(</span><span class="nv">%esi</span><span class="p">)</span><span class="w"> </span><span class="c1"># 3 bytes - die Adresse des Strings wird in den Speicher geschrieben</span>
<span class="nf">movb</span><span class="w"> </span><span class="no">$0x0</span><span class="p">,</span><span class="mi">0x7</span><span class="p">(</span><span class="nv">%esi</span><span class="p">)</span><span class="w"> </span><span class="c1"># 4 bytes - der String wird nullterminiert</span>
<span class="nf">movl</span><span class="w"> </span><span class="no">$0x0</span><span class="p">,</span><span class="mi">0xc</span><span class="p">(</span><span class="nv">%esi</span><span class="p">)</span><span class="w"> </span><span class="c1"># 7 bytes - ein nullpointer für das environment</span>
<span class="nf">movl</span><span class="w"> </span><span class="no">$0xb</span><span class="p">,</span><span class="nv">%eax</span><span class="w"> </span><span class="c1"># 5 bytes - syscall-nummer in eax</span>
<span class="nf">movl</span><span class="w"> </span><span class="nv">%esi</span><span class="p">,</span><span class="nv">%ebx</span><span class="w"> </span><span class="c1"># 2 bytes - ebx enthält die adresse von "/bin/sh"</span>
<span class="nf">leal</span><span class="w"> </span><span class="mi">0x8</span><span class="p">(</span><span class="nv">%esi</span><span class="p">),</span><span class="nv">%ecx</span><span class="w"> </span><span class="c1"># 3 bytes - argumente, ein pointer auf den string und ein nullpointer</span>
<span class="nf">leal</span><span class="w"> </span><span class="mi">0xc</span><span class="p">(</span><span class="nv">%esi</span><span class="p">),</span><span class="nv">%edx</span><span class="w"> </span><span class="c1"># 3 bytes - environment</span>
<span class="nf">int</span><span class="w"> </span><span class="no">$0x80</span><span class="w"> </span><span class="c1"># 2 bytes - interrupt wird ausgelöst</span>
<span class="nf">movl</span><span class="w"> </span><span class="no">$0x1</span><span class="p">,</span><span class="w"> </span><span class="nv">%eax</span><span class="w"> </span><span class="c1"># 5 bytes - exit-interrupt</span>
<span class="nf">movl</span><span class="w"> </span><span class="no">$0x0</span><span class="p">,</span><span class="w"> </span><span class="nv">%ebx</span><span class="w"> </span><span class="c1"># 5 bytes - wird vorbereitet</span>
<span class="nf">int</span><span class="w"> </span><span class="no">$0x80</span><span class="w"> </span><span class="c1"># 2 bytes - interrupt wird ausgelöst</span>
<span class="nf">call</span><span class="w"> </span><span class="mi">-0</span><span class="no">x2f</span><span class="w"> </span><span class="c1"># 5 bytes - ein call zurück, dabei wird der eip auf den Stack gepusht</span>
<span class="na">.string</span><span class="w"> </span><span class="err">\</span><span class="s">"/bin/sh\" # 8 bytes</span>
<span class="s">"</span><span class="p">)</span><span class="c1">;</span>
<span class="err">}</span>
</pre></div>
<p>Der Opcode String:
</p>
<div class="mw-highlight mw-highlight-lang-asm mw-content-ltr" dir="ltr"><pre><span></span><span class="nf">char</span><span class="w"> </span><span class="no">shellcode</span><span class="p">[]</span><span class="w"> </span><span class="err">=</span>
<span class="err">"\</span><span class="nf">xeb</span><span class="err">\</span><span class="no">x2a</span><span class="err">\</span><span class="no">x5e</span><span class="err">\</span><span class="no">x89</span><span class="err">\</span><span class="no">x76</span><span class="err">\</span><span class="no">x08</span><span class="err">\</span><span class="no">xc6</span><span class="err">\</span><span class="no">x46</span><span class="err">\</span><span class="no">x07</span><span class="err">\</span><span class="no">x00</span><span class="err">\</span><span class="no">xc7</span><span class="err">\</span><span class="no">x46</span><span class="err">\</span><span class="no">x0c</span><span class="err">\</span><span class="no">x00</span><span class="err">\</span><span class="no">x00</span><span class="err">\</span><span class="no">x00</span><span class="err">"</span>
<span class="err">"\</span><span class="nf">x00</span><span class="err">\</span><span class="no">xb8</span><span class="err">\</span><span class="no">x0b</span><span class="err">\</span><span class="no">x00</span><span class="err">\</span><span class="no">x00</span><span class="err">\</span><span class="no">x00</span><span class="err">\</span><span class="no">x89</span><span class="err">\</span><span class="no">xf3</span><span class="err">\</span><span class="no">x8d</span><span class="err">\</span><span class="no">x4e</span><span class="err">\</span><span class="no">x08</span><span class="err">\</span><span class="no">x8d</span><span class="err">\</span><span class="no">x56</span><span class="err">\</span><span class="no">x0c</span><span class="err">\</span><span class="no">xcd</span><span class="err">\</span><span class="no">x80</span><span class="err">"</span>
<span class="err">"\</span><span class="nf">xb8</span><span class="err">\</span><span class="no">x01</span><span class="err">\</span><span class="no">x00</span><span class="err">\</span><span class="no">x00</span><span class="err">\</span><span class="no">x00</span><span class="err">\</span><span class="no">xbb</span><span class="err">\</span><span class="no">x00</span><span class="err">\</span><span class="no">x00</span><span class="err">\</span><span class="no">x00</span><span class="err">\</span><span class="no">x00</span><span class="err">\</span><span class="no">xcd</span><span class="err">\</span><span class="no">x80</span><span class="err">\</span><span class="no">xe8</span><span class="err">\</span><span class="no">xd1</span><span class="err">\</span><span class="no">xff</span><span class="err">\</span><span class="no">xff</span><span class="err">"</span>
<span class="err">"\</span><span class="nf">xff</span><span class="err">\</span><span class="no">x2f</span><span class="err">\</span><span class="no">x62</span><span class="err">\</span><span class="no">x69</span><span class="err">\</span><span class="no">x6e</span><span class="err">\</span><span class="no">x2f</span><span class="err">\</span><span class="no">x73</span><span class="err">\</span><span class="no">x68</span><span class="err">\</span><span class="no">x00</span><span class="err">\</span><span class="no">x89</span><span class="err">\</span><span class="no">xec</span><span class="err">\</span><span class="no">x5d</span><span class="err">\</span><span class="no">xc3</span><span class="err">"</span><span class="c1">;</span>
</pre></div>
<p>Dieser Code ist jedoch nicht sonderlich geschickt, da er Nullbytes enthält und recht lang ist. Zur Vermeidung von „unerwünschten Zeichen“ werden häufig auch Encoder verwendet, welche eine Maskierung und spätere Demaskierung dieser Zeichen ermöglichen und den Shellcode eventuell noch zusätzlich komprimieren. Es gibt auch noch andere Techniken, die Adresse des Strings herauszufinden, als einen „jmp“ oder „call“. Es ist beispielsweise möglich, lediglich <code>/bin/sh</code> auf den Stack zu pushen. Danach enthält der <i>esp</i> die Adresse.
</p>
<div class="mw-heading mw-heading2"><h2 id="Literatur">Literatur</h2></div>
<ul><li>Jack Koziol: <i>The Shellcoder’s Handbook. Discovering and Exploiting Security Holes.</i> Wiley, Indianapolis IN 2004, ISBN 0-7645-4468-3.</li>
<li>Jon Erickson: <i>Forbidden Code.</i> mitp, Bonn 2004, ISBN 3-8266-1457-7.</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Weblinks">Weblinks</h2></div>
<ul><li><a rel="nofollow" class="external text" href="http://www.shell-storm.org/shellcode/">Shellcode database</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="Einzelnachweise">Einzelnachweise</h2></div>
<ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text">Quelle: <style data-mw-deduplicate="TemplateStyles:r261891140">
/* start https://de.wikipedia.org/ */


.mw-parser-output .webarchiv-memento a{color:inherit}


/* end https://de.wikipedia.org/ */
</style><a rel="nofollow" class="external text" href="https://web.archive.org/web/20080211101739/http://www.phrack.org/archives/49/P49-14">phrack.org</a> (<span class="webarchiv-memento"><a href="Webarchivierung#Begrifflichkeiten" title="Webarchivierung">Memento</a></span> vom 11. Februar 2008 im <i><a href="Internet_Archive" title="Internet Archive">Internet Archive</a></i>)</span>
</li>
</ol></div><!--htdig_noindex--><div><div class="zim-footer">
Dieser Artikel wurde von <a class="external text" title="Zuletzt bearbeitet am 2020-06-18" href="https://de.wikipedia.org/wiki/?title=Shellcode&amp;oldid=201099305">Wikipedia</a> herausgegeben. Der Text ist unter <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.de">Creative Commons Attribution-Share Alike 4.0</a> verfügbar, sofern nicht anders angegeben. Für die Mediendateien können zusätzliche Bedingungen gelten.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>

</body></html>